package com.cs.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cs.constant.ProdPropConstant;
import com.cs.domain.ProdProp;
import com.cs.domain.ProdPropValue;
import com.cs.mapper.ProdPropMapper;
import com.cs.mapper.ProdPropValueMapper;
import com.cs.service.ProdPropService;
import com.cs.service.ProdPropValueService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
@CacheConfig(cacheNames ="com.cs.service.impl.ProdPropServiceImpl" )
public class ProdPropServiceImpl extends ServiceImpl<ProdPropMapper, ProdProp> implements ProdPropService{

    @Autowired
    private ProdPropMapper prodPropMapper;
    @Autowired
    private ProdPropValueMapper prodPropValueMapper;
    @Autowired
    private ProdPropValueService prodPropValueService;

    /**
     * 分页查询规格的接口
     * 规格和规格值是一对多的关系
     * @param prodProp
     * @return
     */
    @Override
    @Cacheable(key = ProdPropConstant.PRODPROP_PAGE_PREFIX)
    public Page<ProdProp> findProdPropPage(Page<ProdProp> page,ProdProp prodProp) {
        //分页查询规格
        Page<ProdProp> prodPropPage = prodPropMapper.
                selectPage(page, new LambdaQueryWrapper<ProdProp>().like(StringUtils.hasText(prodProp.getPropName()), ProdProp::getPropName, prodProp.getPropName()));
        //分页的规格数据
        List<ProdProp> prodPropList = prodPropPage.getRecords();
        if(CollectionUtils.isEmpty(prodPropList)){
            return prodPropPage;
        }
        //规格的id
        List<Long> prodPropIds = prodPropList.stream().map(ProdProp::getPropId).collect(Collectors.toList());
        //拿到得规格值的表
        List<ProdPropValue> prodPropValues = prodPropValueMapper.selectList(new LambdaQueryWrapper<ProdPropValue>().in(ProdPropValue::getPropId, prodPropIds));
        //返回组装返回的数据
        prodPropList.forEach(prodProp1 -> {
            List<ProdPropValue> propValues = prodPropValues.stream().filter(prodPropValue -> prodPropValue.getPropId().equals(prodProp1.getPropId())).collect(Collectors.toList());
            prodProp1.setProdPropValues(propValues);
        });
        return prodPropPage;
    }

    /**
     * 添加规格和规格值
     * @param prodProp
     * @return
     */
    @Override
    @Caching(evict = {
            @CacheEvict(key = ProdPropConstant.PRODPROP_PAGE_PREFIX),
            @CacheEvict(key = ProdPropConstant.PRODPROP_LIST_PREFIX)
    })
    public boolean save(ProdProp prodProp) {
        //先添加规格
        prodProp.setShopId(1L);
        prodProp.setRule(2);
        int insert = prodPropMapper.insert(prodProp);
        if(insert>0){
            List<ProdPropValue> prodPropValues = prodProp.getProdPropValues();
            if(!CollectionUtils.isEmpty(prodPropValues)){
                prodPropValues.forEach(prodPropValue -> {
                    prodPropValue.setPropId(prodProp.getPropId());
                });
            }
            //批量插入
            prodPropValueService.saveBatch(prodPropValues);
        }
        return insert>0;
    }

    /**
     * 全查询规格
     * @return
     */
    @Override
    @Cacheable(key = ProdPropConstant.PRODPROP_LIST_PREFIX)
    public List<ProdProp> list() {
        List<ProdProp> prodPropList = prodPropMapper.selectList(null);
        return prodPropList;
    }

}
